# 比赛规则
# -双人击球比赛:A& B，回合制，5局3胜
# -开始时一方先发球，直至判分，接下来胜者发球
# -球员只能在发球局得分，15分胜一局


# 自顶向下
# 解决复杂问题的有效方法
# -将一个总问题表达为若干个小问题组成的形式
# -使用同样方法进一步分解小问题
# -直至，小问题可以用计算机简单明了的解决

# 自底向上(执行)
# 逐步组建复杂系统的有效测试方法
# -分单元测试，逐步组装
# -按照自顶向下相反的路径操作
# -直至，系统各部分以组装的思路都经过测试和验证

from random import random


def printInfo():
    print("这个程序模拟两个选手A和B的某种竞技比赛")
    print("程序运行需要A和B的能力值（以0到1之间的小数表示）")


def getInputs():
    proA = eval(input("请输入选手A的能力值"))
    proB = eval(input("请输入选手B的能力值"))
    n = eval(input("模拟比赛的场次"))
    return proA, proB, n


def simNGames(proA, proB, n):
    print("竞技分析开始，共模拟{}场比赛\n".format(n))
    winA = 0
    winB = 0
    for i in range(n):
        if simOneGame(proA, proB) == 1:
            winA += 1
        else:
            winB += 1
    return winA, winB


def simOneGame(proA, proB):
    scoreA = 0
    scoreB = 0
    ScoreA = 0
    ScoreB = 0
    if random() > 0.5:
        firstball = 1
    else:
        firstball = 0
    while ScoreA != 3 and ScoreB != 3:  # 注意是and
        while scoreA != 15 and scoreB != 15:
            a = random()
            if firstball == 1:
                if proA > a:
                    scoreA += 1
                else:
                    scoreB += 1
                    firstball = 0
            else:
                if proB > a:
                    scoreB += 1
                else:
                    scoreA += 1
                    firstball = 1
        if scoreA == 15:
            ScoreA += 1
        else:
            ScoreB += 1
    print(ScoreA, ":", ScoreB)
    if ScoreA == 3:
        return 1
    else:
        return 0


def printSummary(winA, winB):
    aa = winA / (winA + winB)
    bb = winB / (winA + winB)
    print("选手A获胜{}场比赛，占比{:2f}\n".format(winA, aa))
    print("选手B获胜{}场比赛，占比{:2f}\n".format(winB, bb))


def main():
    printInfo()
    proA, proB, n = getInputs()
    winA, winB = simNGames(proA, proB, n)
    printSummary(winA, winB)


main()


